import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;

/**
 * COSC 455 Programming Languages: Project 1 Implementation
 * @author Colin Murray
 */
public class Compiler {
	/**
	 * main function that utilizes MyLexicalAnalyzer and MySyntaxAnalyzer
	 * generates an executable html5 file from a .mkd markdown input file
	 * @param args
	 * @throws Exception
	 */
	public static void main( String[] args ) throws Exception {
		
		/** The input file path. */
		String inFile = "";
		
		/** The contents of the input file. */
		String inStr = "";
		
		/** Size of command line arguments array */
		int alen = args.length;
		
		if ( alen == 1) {
			if( args[0].substring( args[0].length() - 4 ).equals( ".mkd") ) {
				inFile = args[0];
				inStr = new String(Files.readAllBytes(Paths.get(inFile)));
			}
			else {
				throw new CompilerException( "Usage: <.mkd file path>" );
			}
		}
		else {
			throw new CompilerException( "Usage: <.mkd file path>" );
		}
		
		/** The list of valid tokens for mark down language. */
		ArrayList<String> validTokens = new ArrayList<String>();
		
		validTokens.add( "#START DOCUMENT" ); validTokens.add( "#END DOCUMENT" ); validTokens.add( "#START HEAD" );
		validTokens.add( "#END HEAD" ); validTokens.add( "#START TITLE" ); validTokens.add( "#END TITLE" ); 
		validTokens.add( "#START PARAGRAPH" ); validTokens.add( "#END PARAGRAPH" ); validTokens.add( "#START BOLD" );
		validTokens.add( "#END BOLD" ); validTokens.add( "#START ITALICS" ); validTokens.add( "#END ITALICS" );
		validTokens.add( "#START LIST" ); validTokens.add( "#END LIST" ); validTokens.add( "#START ITEM" ); 
		validTokens.add( "#END ITEM" ); validTokens.add( "#NEWLINE" ); validTokens.add( "#START AUDIO" ); 
		validTokens.add( "#END AUDIO" ); validTokens.add( "#START VIDEO" ); validTokens.add( "#END VIDEO" ); 
		validTokens.add( "#START DEFINE" ); validTokens.add( "#NAME" ); validTokens.add( "#VALUE" );
		validTokens.add( "#END DEFINE" ); validTokens.add( "#START USE" ); validTokens.add( "#END USE" );
			
		MyLexicalAnalyzer lex = new MyLexicalAnalyzer( inStr, validTokens);
		MySyntaxAnalyzer syn = new MySyntaxAnalyzer( inStr, lex );
		MySemanticAnalyzer sem = new MySemanticAnalyzer( syn.getHtml5() );
		
		sem.makeHtml5(inFile);
	}
}
